package main

import (
	"fmt"
	"sync/atomic"
)

// configuration 表示全局配置对象。
type configuration struct {
	// 环境变量集合。
	Env map[string]string `json:"env"`
	// 服务集合。
	Services map[string]*serviceConfig `json:"services"`
}

// 表示服务配置对象。
type serviceConfig struct {
	// 源码目录
	SrcDir string `json:"srcDir"`
	// 工作目录。
	WorkDir string `json:"workDir"`
	// 启动服务的命令行。
	Cmd string `json:"cmd"`
}

func (cfg *configuration) String() string {
	return fmt.Sprintf("{ env: %v, services: %v }", cfg.Env, cfg.Services)
}

func (cfg *serviceConfig) String() string {
	return fmt.Sprintf("{ src-dir: %v, work-dir: %v, cmd: %v }", cfg.SrcDir, cfg.WorkDir, cfg.Cmd)
}

type event struct {
	i int32
}

func (evt *event) accquire() bool {
	return atomic.CompareAndSwapInt32(&evt.i, 0, 1)
}

func (evt *event) release() {
	evt.i = 0
}

// 截断字符串到指定的长度，如果原始字符串超过了指定的长度，那么在末尾追加省略号 `...`
// s 待截断的原始字符串。
// n 最大长度。此参数的值不能小于等于`3`。
func truncateStr(s string, n int) string {
	if len(s) <= n {
		return s
	} else {
		return s[:n-3] + "..."
	}
}
